package com.chaodev.base.service.impl;

import com.chaodev.base.base.RedisDao;
import com.chaodev.base.config.JwtConfig;
import com.chaodev.base.dao.LoginDao;
import com.chaodev.base.model.Result;
import com.chaodev.base.model.SimpleLoginDTO;
import com.chaodev.base.model.UserInfo;
import com.chaodev.base.service.ILoginService;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;


@Service
public class LoginServiceImpl implements ILoginService {
    private org.slf4j.Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class);

    @Autowired
    private RedisDao redisDao;

    @Autowired
    private LoginDao loginDao;

    @Resource
    private JwtConfig jwtConfig ;

//    @Override
//    public void login(Map<String, Object> map) {
//        loginDao.login(map);
//    }
    @Override
    @Transactional
    public Result login(Map<String,Object> map) {
        String result = "";
        Result loginResult = new Result();
        String userId = map.get("username").toString();
        String passWord = map.get("password").toString();
        //先查找用户是否存在
        SimpleLoginDTO userInfo = loginDao.getUserInfo(map);
        if (userInfo != null && userInfo.getPassword() != null) {
            //插入登录日志
            loginDao.insertLoginLog(map);
            //查看剩余时间，如果达到30分钟自动解锁
            Date now=new Date();
            if(userInfo.getState() == 2){
                if(now.getTime()-userInfo.getLockTime().getTime()>=30*60*1000){
                    //解锁
                    loginDao.unlockAccount(map);
                    userInfo.setState(1);
                }
            }

            //被锁定
            if (userInfo.getState() == 2) {
                long leftMin=(30*60*1000-((now.getTime()-userInfo.getLockTime().getTime())))/60000;
                loginResult.setCode(-3);
                loginResult.setMsg("-3|工号处于锁定状态，请"+leftMin+"分钟后再试或联系管理员解锁！");
                return loginResult;
            }
            //被停用
            else if(userInfo.getState()==5){
                loginResult.setCode(-3);
                loginResult.setMsg("-3|工号已被停用，请联系管理员！");
                return loginResult;
            }
            //成功
            else{
                //密码正确
                if(passWord.equals(userInfo.getPassword())){
                    //判断密码是否过期
//                    long passDay=now.getTime()-userInfo.getPwdEditDate().getTime();
                    //过期
//                    if(passDay>=90*24*60*60*1000){
//                        loginDao.lockAccount(userId);
//                        loginResult.setCode(-5);
//                        loginResult.setMsg("-5|密码已过期！");
//                        return loginResult;
//                    }
//                    else{
                        //校验密码强度
//                        String pwdStrength=map.get("P_PWD_STRENGTH").toString();
                        //密码强度弱
//                        if("0".equals(pwdStrength)){
//                            loginDao.lockAccount(userId);
//                            loginResult.setCode(-6);
//                            loginResult.setMsg(" -6|密码强度不够");
//                            return loginResult;
//                        }
                        //校验通过
//                        else{
                            //更新用户信息
                            loginDao.updateUserInfo(map);
                            //处理数据
                            UserInfo users= loginDao.getFullUserInfo(map);
                            loginResult.setCode(0);
                            loginResult.setMsg(" 0|成功！");
                            loginResult.setData(users);
                            return loginResult;
//                        }
//                    }
                }
                //不正确
                else{
                    //更新错误次数
                    loginDao.updateErrorCount(map);
                    //锁号
                    if(userInfo.getPwdErrorCount()>=2){
                        loginDao.lockAccount(map);
                        loginResult.setCode(-3);
                        loginResult.setMsg("-3|工号处于锁定状态，请30分钟后再试或联系管理员解锁！");
                        return loginResult;
                    }
                    else{
                        loginResult.setCode(-2);
                        loginResult.setMsg("-2|用户名或密码错误！");
                        return loginResult;
                    }
                }
            }
        }
        //用户信息不存在
        else {
            loginResult.setCode(-2);
            loginResult.setMsg("-2|用户名或密码错误！");
            return loginResult;
        }
    }
//    @Override
//    public Result SigleLogin(Map<String,Object> map, HttpServletRequest request, HttpServletResponse response){
//        String result="";
//        Result loginResult=new Result();
//        loginDao.SigleLogin(map);
//        result=map.get("P_RESULT").toString();
//        ArrayList<UserInfo> userinfo = (ArrayList<UserInfo>) map.get("v_cursor");
//        //登录不成功
//        if (!result.equals("YES")) {
//            loginResult.setCode(-2);
//            loginResult.setMsg(result);
//            return loginResult;
//        } else {
//            if (userinfo != null && userinfo.size() > 0) {
//                try {
//                    ///生成token
//                    UserInfo userInfo = userinfo.get(0);
//                    String userId = userInfo.getUserName();
//                    byte[] b = userId.getBytes("UTF-8");
//                    userId = new String(b, "UTF-8");
//                    String roleId=userInfo.getRoleName();
//                    byte[] c = roleId.getBytes("UTF-8");
//                    roleId = new String(c, "UTF-8");
//                    String departId=userInfo.getDepartName();
//                    byte[] d = departId.getBytes("UTF-8");
//                    departId = new String(d, "UTF-8");
////                    String acctSetName=userInfo.getACCT_SET_NAME();
////                    byte[] e = acctSetName.getBytes("UTF-8");
////                    acctSetName = new String(e, "UTF-8");
//                    String skin=userInfo.getUserSkin();
//                    byte[] s = skin.getBytes("UTF-8");
//                    skin = new String(s, "UTF-8");
//                    String token = JwtUtil.createToken(userInfo.getUserId(),userId, userInfo.getDepartId(), userInfo.getRoleId(),roleId,departId,userInfo.getRealAccNbr(),userInfo.getAreaCode(),userInfo.getDepartId(),"",userInfo.getAreaCode(),userInfo.getUserId(),skin);
//                    redisDao.vSet(token, userInfo.getUserId(),600*60L);
//                    loginResult.setCode(0);
//                    loginResult.setData(token);
//                    loginResult.setMsg("登录成功");
//                    return loginResult;
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//                loginResult.setCode(-2);
//                loginResult.setMsg("Token生成失败！");
//                return loginResult;
//            }
//            else
//            {
//                loginResult.setCode(-2);
//                loginResult.setMsg("用户信息获取失败");
//                return loginResult;
//            }
//        }
//    }
}
